home *** CD-ROM | disk | FTP | other *** search
- ;/*
- * COPASM.A by Patrick van Logchem (v912152@si.hhs.nl)
- * last changed on 16 march 1994
- */
-
- SECTION copasm,CODE
-
- XDEF _leftmouse
- XDEF _rightmouse
- XDEF _chopper
- XDEF _setcopper
- XDEF _setcolor
- XDEF _getcolor
- XDEF _ytab
- XDEF _xoff
-
- NEXTROW EQU 40
- ROWS EQU 80
-
- HIGH_E EQU 3
- HIGH_O EQU 2
- WIDTH EQU 2
-
- TEST EQU 0
-
- _leftmouse:
- moveq #0,d0
- btst #6,$bfe001
- seq d0
- rts
-
- _rightmouse:
- moveq #0,d0
- btst #7,$bfe001
- seq d0
- rts
-
- _ytab dc.l 0
- _xoff dc.l 0
-
- ; 'chopper' fills all what's needed for a chunky-copper-screen.
- _chopper:
- ; a0 = adres first bitplane
- ; d0 = offset next bitplane
- ; a1 = adres copperlist
- ; a2 = adres y-adres-table
- ; a3 = adres x-offset-table
- movem.l d0-d7/a0-a6,-(a7)
-
- move.l a2,_ytab
- move.l a3,_xoff
-
- ; Setup copper to display screen:
- move.l #$01800000,(a1)+ ; color0 = $0000
- move.l #$010c0011,(a1)+ ; bplcon4 = $0011
- move.l #$008e2269,(a1)+ ; diwstrt = $2269
- move.l #$01000210,(a1)+ ; bplcon0 = $0210
- move.l #$01040224,(a1)+ ; bplcon2 = $0224
- move.l #$009022a9,(a1)+ ; diwstop = $22a9
- move.l #$00920018,(a1)+ ; ddfstrt = $0018
- move.l #$009400b8,(a1)+ ; ddfstop = $00b8
- move.l #$01028888,(a1)+ ; bplcon1 = $8888
- move.l #$0108fff8,(a1)+ ; bpl1mod = $fff8
- move.l #$010afff8,(a1)+ ; bpl2mod = $fff8
- move.l #$01e42100,(a1)+ ; diwhigh = $2100
- move.l #$01fc0003,(a1)+ ; fmode = $0003
-
- move.l a0,d1
- move.w #$00e0,d2 ; d2.w = first planes' high-pointer
- moveq #8-1,d7 ; do 8 bitplanes
- ploop:
- move.w d2,(a1)+ ; place this planes' high-pointer
- addq #2,d2 ; d2.w = low-pointer
- swap.w d1 ; d1.w = high-adres
- move.w d1,(a1)+ ; place high-adres
-
- move.w d2,(a1)+ ; place this planes' low-pointer
- addq #2,d2 ; d2.w = next planes' high-pointer
- swap.w d1 ; d1.w = low-adres
- move.w d1,(a1)+ ; place low-adres
-
- add.l d0,d1 ; goto next bitplane
- dbf d7,ploop ; loop
-
- ; fill rest of copper with color-bank-fills (and do adres-table meanwhile):
- move.l #$00020000,d4 ; next color add
- move.l #$2007fffe,d2 ; starting row
- move.l #HIGH_E<<24,d3 ; even row add
- move.l #HIGH_O<<24,d5 ; odd row add
-
- move.l #(ROWS/2)-1,d6 ; do ROWS/2 lines (even & odd)
-
- rloop:
- move.l d2,(a1)+ ; place wait-instruction
- add.l d3,d2 ; next row
- move.l a1,(a2)+ ; place adres in y-adres table
-
- move.l #$01060c60,(a1)+ ; select bank 0
- move.l #$01800000,d1
- moveq #32-1,d7
- cloop0: move.l d1,(a1)+
- add.l d4,d1
- dbf d7,cloop0 ; place all 32 colors
-
- move.l #$01062c60,(a1)+ ; select bank 1
- move.l #$01800000,d1
- moveq #32-1,d7
- cloop1: move.l d1,(a1)+
- add.l d4,d1
- dbf d7,cloop1 ; place all 32 colors
-
- move.l #$01064c60,(a1)+ ; select bank 2
- move.l #$01800000,d1
- moveq #32-1,d7
- cloop2: move.l d1,(a1)+
- add.l d4,d1
- dbf d7,cloop2 ; place all 32 colors
-
- move.l d2,(a1)+ ; place wait-instruction
- add.l d5,d2 ; next row
- move.l a1,(a2)+ ; place adres in y-adres table
-
- move.l #$01068c60,(a1)+ ; select bank 4
- move.l #$01800000,d1
- moveq #32-1,d7
- cloop4: move.l d1,(a1)+
- add.l d4,d1
- dbf d7,cloop4 ; place all 32 colors
-
- move.l #$0106ac60,(a1)+ ; select bank 5
- move.l #$01800000,d1
- moveq #32-1,d7
- cloop5: move.l d1,(a1)+
- add.l d4,d1
- dbf d7,cloop5 ; place all 32 colors
-
- move.l #$0106cc60,(a1)+ ; select bank 6
- move.l #$01800000,d1
- moveq #32-1,d7
- cloop6: move.l d1,(a1)+
- add.l d4,d1
- dbf d7,cloop6 ; place all 32 colors
-
- ifeq TEST-1
- move.l #$01060c60,(a1)+
- move.l #$01800888,(a1)+ ; test time left
- endc
-
- dbf d6,rloop
-
- ; fill x_offset table:
- moveq #6,d4 ; first offset is 6 (after bank-select)
- moveq #3-1,d6 ; do 3 banks
- bloop moveq #32-1,d7 ; do 32 colors
- oloop move.w d4,(a3)+ ; place offset
- addq #4,d4 ; next offset
- dbf d7,oloop ; do all offsets
-
- addq #4,d4 ; skip bank-select statement
- dbf d6,bloop ; do all banks
-
- ; plot pixels in the bitplanes:
- pln0: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp0: moveq #HIGH_E+HIGH_O-1,d6
- blp0: move.l a2,a3
- ifeq WIDTH-3
- move.l #$1c71c71c,(a3)+
- move.l #$71c71c71,(a3)+
- move.l #$c71c71c7,(a3)+
- move.l #$1c71c71c,(a3)+
- move.l #$71c71c71,(a3)+
- move.l #$c71c71c7,(a3)+
- move.l #$1c71c71c,(a3)+
- move.l #$71c71c71,(a3)+
- move.l #$c71c71c7,(a3)+
- else
- move.l #$33333333,(a3)+
- move.l #$33333333,(a3)+
- move.l #$33333333,(a3)+
- move.l #$33333333,(a3)+
- move.l #$33333333,(a3)+
- move.l #$33333333,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp0
- dbf d7,ylp0
- lea (a0,d0.l),a0
-
- pln1: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp1: moveq #HIGH_E+HIGH_O-1,d6
- blp1: move.l a2,a3
- ifeq WIDTH-3
- move.l #$03f03f03,(a3)+
- move.l #$f03f03f0,(a3)+
- move.l #$3f03f03f,(a3)+
- move.l #$03f03f03,(a3)+
- move.l #$f03f03f0,(a3)+
- move.l #$3f03f03f,(a3)+
- move.l #$03f03f03,(a3)+
- move.l #$f03f03f0,(a3)+
- move.l #$3f03f03f,(a3)+
- else
- move.l #$0f0f0f0f,(a3)+
- move.l #$0f0f0f0f,(a3)+
- move.l #$0f0f0f0f,(a3)+
- move.l #$0f0f0f0f,(a3)+
- move.l #$0f0f0f0f,(a3)+
- move.l #$0f0f0f0f,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp1
- dbf d7,ylp1
- lea (a0,d0.w),a0
-
- pln2: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp2: moveq #HIGH_E+HIGH_O-1,d6
- blp2: move.l a2,a3
- ifeq WIDTH-3
- move.l #$000fff00,(a3)+
- move.l #$0fff000f,(a3)+
- move.l #$ff000fff,(a3)+
- move.l #$000fff00,(a3)+
- move.l #$0fff000f,(a3)+
- move.l #$ff000fff,(a3)+
- move.l #$000fff00,(a3)+
- move.l #$0fff000f,(a3)+
- move.l #$ff000fff,(a3)+
- else
- move.l #$00ff00ff,(a3)+
- move.l #$00ff00ff,(a3)+
- move.l #$00ff00ff,(a3)+
- move.l #$00ff00ff,(a3)+
- move.l #$00ff00ff,(a3)+
- move.l #$00ff00ff,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp2
- dbf d7,ylp2
- lea (a0,d0.w),a0
-
- pln3: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp3: moveq #HIGH_E+HIGH_O-1,d6
- blp3: move.l a2,a3
- ifeq WIDTH-3
- move.l #$000000ff,(a3)+
- move.l #$ffff0000,(a3)+
- move.l #$00ffffff,(a3)+
- move.l #$000000ff,(a3)+
- move.l #$ffff0000,(a3)+
- move.l #$00ffffff,(a3)+
- move.l #$000000ff,(a3)+
- move.l #$ffff0000,(a3)+
- move.l #$00ffffff,(a3)+
- else
- move.l #$0000ffff,(a3)+
- move.l #$0000ffff,(a3)+
- move.l #$0000ffff,(a3)+
- move.l #$0000ffff,(a3)+
- move.l #$0000ffff,(a3)+
- move.l #$0000ffff,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp3
- dbf d7,ylp3
- lea (a0,d0.w),a0
-
- pln4: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp4: moveq #HIGH_E+HIGH_O-1,d6
- blp4: move.l a2,a3
- ifeq WIDTH-3
- move.l #$00000000,(a3)+
- move.l #$0000ffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$00000000,(a3)+
- move.l #$0000ffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$00000000,(a3)+
- move.l #$0000ffff,(a3)+
- move.l #$ffffffff,(a3)+
- else
- move.l #$00000000,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$00000000,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$00000000,(a3)+
- move.l #$ffffffff,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp4
- dbf d7,ylp4
- lea (a0,d0.w),a0
-
- pln5: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp5: moveq #HIGH_E+HIGH_O-1,d6
- blp5: move.l a2,a3
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- ifeq WIDTH-3
- move.l #$00000000,(a3)+
- move.l #$ffffffff,(a3)+
- endc
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- ifeq WIDTH-3
- move.l #$00000000,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp5
- dbf d7,ylp5
- lea (a0,d0.w),a0
-
- pln6: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp6: moveq #HIGH_E+HIGH_O-1,d6
- blp6: move.l a2,a3
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- ifeq WIDTH-3
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$ffffffff,(a3)+
- endc
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- lea NEXTROW(a2),a2
- dbf d6,blp6
- dbf d7,ylp6
- lea (a0,d0.w),a0
-
- pln7: move.l a0,a2
- move.l #(ROWS/2)-1,d7
- ylp7: moveq #HIGH_E-1,d6
- blp71: move.l a2,a3
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- ifeq WIDTH-3
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- move.l #$00000000,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp71
-
- move.l #HIGH_O-1,d6
- blp72: move.l a2,a3
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- ifeq WIDTH-3
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- move.l #$ffffffff,(a3)+
- endc
- lea NEXTROW(a2),a2
- dbf d6,blp72
- dbf d7,ylp7
-
- ; end copper-list:
- move.l #-2,(a1)+
- move.l #-2,(a1)+
- movem.l (a7)+,d0-d7/a0-a6
-
- ; start de copper with adres in a1:
- move.l a1,a0
-
- _setcopper:
- move.l a0,$dff080
- clr.l $dff088
- rts
-
- _setcolor:
- movem.l d0/a0/a1,-(a7)
-
- move.l _ytab(pc),a0
- move.l (a0,d1.w*4),a0
-
- move.l _xoff(pc),a1
- move.w (a1,d0.w*2),d0
-
- move.w d2,(a0,d0.w)
-
- movem.l (a7)+,d0/a0/a1
- rts
-
- _getcolor:
- movem.l a0/a1,-(a7)
-
- move.l _ytab(pc),a0
- move.l (a0,d1.w*4),a0
-
- move.l _xoff(pc),a1
- move.w (a1,d0.w*2),d0
-
- move.w (a0,d0.w),d0
-
- movem.l (a7)+,a0/a1
- rts
-
- END
-